﻿// 501 距离和.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <memory.h>

using namespace std;
/*

http://oj.daimayuan.top/course/5/problem/224

有一棵 n个节点的树，节点编号从 1到 n。
请求出每个节点到其他所有节点的距离的和。

定义两个节点的距离为它们之间的简单路径上经过了多少条边。

输入格式
第一行一个整数 n表示节点数。

接下来 n−1行，每行两个整数 x,y表示 x号节点和 y号节点之间有一条边。

数据保证读入的是一棵树。

输出格式
输出共 n行，第 i行一个整数表示 i号节点到其他所有节点的距离的和。

样例输入
5
1 2
1 5
2 3
2 4
样例输出
6
5
8
8
9
数据规模
对于所有数据，保证 2≤n≤105,1≤x,y≤n。
*/

struct node {
    node* next;
    int where;
}*first[100001],a[200001];

int n, l,sz[100001];
long long f[100001], v[100001];
bool b[100001];

void makelist(int x, int y) {
    a[++l].where = y;
    a[l].next = first[x];
    first[x] = &a[l];
}

void up(int i) {
    sz[i] = 1;
    b[i] = true;
    for (node* x = first[i]; x; x = x->next) {
        if (!b[x->where]) {
            up(x->where);
            sz[i] += sz[x->where];
            f[i] += f[x->where];
        }
    }
    f[i] += sz[i] - 1;
}

void down(int i) {
    b[i] = true;
    for (node* x = first[i]; x; x = x->next) {
        if (!b[x->where]) {
            v[x->where] = v[i] + f[i] - f[x->where] - sz[x->where] + n - sz[x->where];
            down(x->where);
        }
    }
}

int main()
{
    memset(first, 0,sizeof first);
    l = 0;
    scanf("%d",&n);
    for (int i = 1; i < n; i++) {
        int x, y;
        scanf("%d%d",&x,&y);
        makelist(x, y);
        makelist(y, x);
    }
    memset(b, false, sizeof b);
    up(1);
    memset(b, false, sizeof b);
    down(1);
    for (int i = 1; i <= n; i++) {
        printf("%lld\n",f[i]+v[i]);
    }
    return 0;
}

 